package model

import (
	"time"
)

// User 用户
type User struct {
	Id                     int       `xorm:"INT(11) PK AUTOINCR comment('主键')" json:"id"` //主键
	Balance                int       `xorm:"INT(11)" json:"balance"`
	Name                   string    `xorm:"VARCHAR(255) comment('姓名')" json:"name"` //姓名
	Nickname               string    `xorm:"VARCHAR(50)" json:"nickname"`
	Avatar                 string    `xorm:"VARCHAR(100) comment('头像')" json:"avatar"`
	Account                string    `xorm:"VARCHAR(255) UNIQUE comment('账号')" json:"account"` //账号
	Openid                 string    `xorm:"VARCHAR(64) UNIQUE comment('openid')" json:"openid"`
	Passwd                 string    `xorm:"VARCHAR(255) comment('密码')" json:"passwd"` //密码
	Email                  string    `xorm:"VARCHAR(255) comment('邮箱')" json:"email"`  //邮箱
	Phone                  string    `xorm:"VARCHAR(255) comment('电话')" json:"phone"`  //电话号码
	IsVip                  bool      `xorm:"default false" json:"is_vip"`
	Gpt4Enabled            bool      `xorm:"default false" json:"gpt4_enabled"`
	StableDiffusionEnabled bool      `xorm:"default false" json:"stable_diffusion_enabled"`
	NotifyFlag             bool      `xorm:"default false" json:"notify_flag"`
	FirstSet               bool      `xorm:"default true" json:"first_set"`
	LastIp                 string    `xorm:"default" json:"last_ip"`
	Ltime                  time.Time `xorm:"DATETIME comment('上次登录时间')" json:"ltime"` //上次登录时间
	Ctime                  time.Time `xorm:"DATETIME comment('创建时间')" json:"ctime"`   //创建时间
}

func (User) TableName() string {
	return "sys_user"
}

// UserGetByOpenid UserLogin 用户登录
func UserGetByOpenid(openid string) (*User, bool) {
	mod := &User{}
	has, _ := db.Where("openid = ?", openid).Get(mod)
	return mod, has
}

// UserGet 单条用户信息
func UserGet(id int) (*User, bool) {
	mod := &User{}
	has, _ := db.ID(id).Get(mod)
	return mod, has
}

// UserEdit 编辑用户信息
func UserEdit(mod *User, cols ...string) error {
	sess := db.NewSession()
	defer sess.Close()
	sess.Begin()
	if _, err := sess.ID(mod.Id).Cols(cols...).Update(mod); err != nil {
		sess.Rollback()
		return err
	}
	sess.Commit()
	return nil
}

func UserAdd(mod *User) error {
	sess := db.NewSession()
	defer sess.Close()
	sess.Begin()
	if _, err := sess.Insert(mod); err != nil {
		sess.Rollback()
		return err
	}
	sess.Commit()
	return nil
}
